package customgeneric;

/**
 * @author DCSGO
 * @version 1.0
 * 自定义泛型接口
 */
public class CustomInterfaceGeneric {
    //基本语法：
    /*
    interface 接口名 <T,R...>{

    }
    */
    //注意细节：
    //1.接口中 静态成员也不能使用泛型(与泛型类的规定相同)
    //2.泛型接口的类型 在继承接口或者实现接口时确定
    //3.没有指定类型 类型参数默认为 Object
    //补充：
    //1.接口当中的成员属性默认是被 public static final 修饰的
    //2.接口当中的成员方法默认是被 public abstract 修饰的

    public static void main(String[] args) {
        CA ca = new CA();
        ca.methodT("hi");
        //ca.methodT(1);//编译错误 需要 String 提供 int
        //CA.methodT

        ca.methodTR("555", 111);
        //ca.methodTR("555",111.1);//编译错误 需要 Integer 提供 double
        //t.getClass= class java.lang.String
        //r.getClass= class java.lang.Integer

        CB cb = new CB();
        //cb.methodT(1.1);//编译错误 需要 Float 提供 double
        cb.methodT(1.1F);
        //CB.methodT
        //cb.methodTR(1.2F,12);//编译错误
        cb.methodTR(1.2F, (char) 12);
        //t.getClass= class java.lang.Float
        //r.getClass= class java.lang.Character

        System.out.println("-------------------");
        CD cd = new CD();
        cd.methodTR("hi", new ITest<Boolean, ITest<String, String>>() {
            @Override
            public void methodT(Boolean aBoolean) {
            }

            @Override
            public void methodTR(Boolean aBoolean, ITest<String, String> stringStringITest) {
                ITest.super.methodTR(aBoolean, stringStringITest);
            }
        });
        //t.getClass= class java.lang.String
        //r.getClass= class customgeneric.CustomInterfaceGeneric$1

    }
}

interface ITest<T, R> {
    //T t;//编译错误 接口中的属性默认用 static 修饰
    void methodT(T t);

    default void methodTR(T t, R r) {
        System.out.println("t.getClass= " + t.getClass());
        System.out.println("r.getClass= " + r.getClass());
    }
}

//泛型接口的类型 在继承接口时确定
interface IA extends ITest<String, Integer> {
    //接口默认是抽象接口 可不重写父接口中的方法
}

//在实现接口 IA 时用 String 替换 T Integer 替换 R
class CA implements IA {

    @Override
    public void methodT(String s) {
        System.out.println("CA.methodT");
    }

    @Override
    public void methodTR(String s, Integer integer) {
        IA.super.methodTR(s, integer);
    }
}

////泛型接口的类型 在实现接口时确定
class CB implements ITest<Float, Character> {

    @Override
    public void methodT(Float aFloat) {
        System.out.println("CB.methodT");
    }

    @Override
    public void methodTR(Float aFloat, Character character) {
        ITest.super.methodTR(aFloat, character);
    }
}

/*
class  CC implements ITest{
}
*/ //与下面代码等价 但编译器会报警告
class CD implements ITest<Object, Object> {

    @Override
    public void methodT(Object o) {
        System.out.println("CD.methodT");
    }

    @Override
    public void methodTR(Object o, Object o2) {
        ITest.super.methodTR(o, o2);
    }
}